﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Algoritmia.DataStructures.Lists;

namespace Demos.Puzzles.Polyominoes
{
    [Serializable]
    public class Montaje
    {
        public string Nombre;
        public int N;
        public Model Tablero;
        public ArrayList<Tuple<char, IEnumerable<IEnumerable<Tuple<int, int>>>>> Fichas;
    }

    [Serializable]
    public class Model
    {
        private List<List<bool>> _tablero;

        public string Tablero
        {
            get
            {
                var tab = new StringBuilder();
                var fila = 0;
                foreach (var t in _tablero)
                {
                    foreach (var cas in t.Select(t1 => t1 ? '.' : ' '))
                    {
                        tab.Append(cas);
                    }
                    if (fila < _tablero.Count-1)
                    {
                        tab.Append("\n");
                    }
                    fila++;
                }
                return tab.ToString();
            }
        }

        public int NumeroCasillasDeshabilitadas
        {
            get
            {
                return _tablero.SelectMany(fila => fila).Count(col => !col);
            }
        }

        public Model()
        {
            _tablero = new List<List<bool>>();
        }

        public void AñadirCasilla(int fila)
        {
            if (fila < 0)
            {
                return;
            }
            while (_tablero.Count <= fila)
            {
                _tablero.Add(new List<bool>());
            }
            _tablero[fila].Add(true);
        }

        public void DeshabilitarCasilla(int fila, int columna)
        {
            if (fila < 0 || fila >= _tablero.Count || columna < 0 || columna>= _tablero[fila].Count)
            {
                return;
            }
            _tablero[fila][columna] = false;
        }

        public int NumFilas()
        {
            return _tablero.Count;
        }

        public int NumColumnas(int fila)
        {
            if (fila >= 0 && fila < _tablero.Count)
            {
                return _tablero[fila].Count;
            }
            return -1;
        }

        public bool CasillaHabilitada(int fila, int columna)
        {
            if (fila >= 0 && fila < _tablero.Count && columna >= 0 && columna < _tablero[fila].Count)
            {
                return _tablero[fila][columna];
            }
            return false;
        }
    }
}
